

import Cocoa

let playground = "Hello, playground"
var mutablePlayground = "Hello mutable playground"
mutablePlayground += "!"

for c:Character in mutablePlayground
{
    print("'\(c)'")
}

//unicode
/*
 字符串编码的国际标准，无缝跨平台，每个字符都被赋予了唯一的数
 */
//Unicode 标量-一个21位的数，如U+1F60E。。。   \u{十六进制数}
let oneCoolDude = "\u{1F60E}"

//uincode 组合标量
let One = "\u{0061}"
let Two = "\u{0301}"
let togeter = "\u{0061}\u{0301}"


//显示字符串背后的Unicode标量
for scalar in playground.unicodeScalars
{
    print("\(scalar.value)")
}


//标准等价
//组合标量有其存在的价值，不过Unicode也为某些常见的字符提供了标量，表示组合过的形式
let Three = "\u{00E1}"
let b = (togeter == Three)  //结果为true
/*
 为什么Swift会认为两个等价呢，这是因为标准等价：指两个Unicode标量序列在语言学层面是否相等。
 */



//计算元素数量
print("together:\(togeter.count),Three:\(Three.count)")
/*
 标准等价意味着无论是用组合标量还是预组合标量，结果都会被当成单个字符。
 */

//2.索引和区间
//let index = playground[3]
/*Swift编译器不允许用下表索引访问字符串中的特定字符，这个和Swift字符串字符的存储方式有关，
 因为Swift无法在不遍历前面每个字符的情况下知道指定的索引对应于那个Unicode标量。不能用整数做索引访问字符串*/
let start = playground.startIndex   //获取字符串的第一个索引
let end = playground.index(start, offsetBy: 4)  //从起始点向后移动4
let fifthCharacter = playground[end]

//区间
let range = start...end
let firstFive = playground[range]
